# 收集汇总多张表格的脚本文件


# 1. 生成某月的表格模板
# 2. 下发表格模板填报
# 3. 收集表格，放到一个文件夹下
# 4. 将表格模板与数据表格依次进行比较，凡是不同的单元格，都将表格模板的数据更新后，标记为红色，所有数据表格比较完，数据就完成了汇总。


# 参数：
# - 数据起始行，0 index
# - 表格模板最大列数
# - 数据文件目录

import os
import sys

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

import argparse


def parse_args():
    parser = argparse.ArgumentParser(description="汇总表格")
    parser.add_argument("--data", help="数据表格路径")
    parser.add_argument("--start-row", type=int, help="表格模板起始行")
    parser.add_argument("--max-col", type=int, help="表格模板最大列数")
    parser.add_argument("--month", type=int, default=0, help="某月")
    parser.add_argument("template", help="表格模板路径")
    return parser.parse_args()


def try_file_path(file_path):
    """测试是否存在文件，如果存在，返回带括号的文件名"""
    tmp_path = file_path
    (root, ext) = os.path.splitext(file_path)
    i = 1
    while os.path.exists(tmp_path):
        tmp_path = f"{root}({i}){ext}"
        i += 1

    return tmp_path


class Spreedsheet:
    def __init__(self, file_path):
        self.file_path = file_path
        self.wb = load_workbook(file_path)

    def diff(self, other, start_row=0):
        ws = self.wb.active
        other_ws = other.wb.active

        same = True

        font = Font(bold=True, color="FF0000", size=9)
        fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        for row in ws.iter_rows(min_row=start_row):
            for cell in row:
                if cell.value != other_ws[cell.coordinate].value:
                    other_ws[cell.coordinate].font = font
                    other_ws[cell.coordinate].fill = fill
                    print(
                        "diff",
                        cell.coordinate,
                        cell.value,
                        other_ws[cell.coordinate].value,
                    )
                    cell.value = other_ws[cell.coordinate].value
                    cell.font = font

                    same = False

        other.wb.save(try_file_path("different.xlsx"))
        self.wb.save(try_file_path("update.xlsx"))
        return same

    def fill_month_template(self, month):
        """本函数要根据表格实际内容进行适配"""

        ws = self.wb.active
        ws["A3"].value = f"{month}月"
        target = try_file_path(f"{month}月.xlsx")
        self.wb.save(target)
        return target


def main():
    args = parse_args()

    print("args", args)

    left = Spreedsheet(args.template)

    # 如果指定了月份，则生成月份模板，并退出程序
    if args.month != 0:
        tem = left.fill_month_template(args.month)
        print("生成表格模板", tem)
        quit()

    # 如果月份为0则说明要收集汇总
    right_files = [os.path.join(args.data, x) for x in os.listdir(args.data)]

    for f in right_files:
        print(f"比较{f}的差异")
        right = Spreedsheet(f)
        left.diff(right, args.start_row)

        if left == right:
            print("Same")
        else:
            print("Different")

    print("Done")


if __name__ == "__main__":
    main()
